Exploring Covid-19 Vaccinations in the United States by Race and Ethnicity
Introduction
The Covid-19 pandemic continues to highlight inequality in health outcomes in the United States. As of April 23rd, 2021, the CDC reports that Hispanic, Black, and American Indian or Alaska Native people are more likely to test positive for, be hospitalized for, and die from Covid-19 when compared to White, non-Hispanic people. Considering these disparities alongside recent developments in vaccine distribution, we became curious as to how race and ethnicity relate to immunization rates in each state.
Various data sources have presented vaccination progress in terms of each state’s efficiency (use of allocated vaccines) and speed (proportion of population that is vaccinated). We have developed a range of visualizations to consider how race and ethnicity relate to vaccine progress in the United States.
Overview
Across the country and over time, White and Asian people are receiving more than their share of vaccines, while Black and Hispanic people are receiving less than their share. American Indians and Pacific Islanders are also generally receiving less than their share, though data is more sparse for these groups. Vaccine distribution for all demographic groups except American Indians or Alaska Natives has become more equitable over time in terms of moving away from either “extremely below share” or “extremely above share.”
White
- 10 states (20%) missing on March 1, 2021 - 4 states (8%) missing on May 10, 2021
- Shift to more states distributing a “proportionate share” of vaccines to those who are White over time, though the Northeastern region continues to fall into “above share” category
Black
- 10 states (20%) missing on March 1, 2021 - 4 states (8%) missing on May 10, 2021
- Earlier maps show most states at “extremely below share” or “below share”, while later maps shift to mostly “below share” with only South Dakota and Pennsylvania at “extremely below share”
- Vermont is consistently below share, despite April eligibility criteria that allowed people of color to be able to register for a vaccine before the general adult population
Hispanic
- 15 states (29%) missing on March 1, 2021 - 8 states (16%) missing on May 10, 2021
- Earlier maps show most states at “extremely below share” or “below share”, while later maps shift to mostly “below share” with only Arizona, Colorado, and Iowa at “extremely below share”
- Alabama, D.C., Louisiana, Maine, Missouri, Vermont, Virginia shift from “below share” to “above share” as the general adult population becomes eligible
Asian
- 14 states (27%) missing on March 1, 2021 - 8 states (16%) missing on May 10, 2021
- Earlier maps show a range of all categories (from “extremely below share” to “extremely above share”) then shift to have 7 states (16% of those reporting) below share
American Indian or Alaska Native
- 20 states (39%) missing on March 1, 2021 - 14 states (27%) missing on May 10, 2021
- Consistently showing over 50% of reporting states at “extremely below share”
Native Hawaiian or Other Pacific Islander
- Consistently have 42 (82%) states missing
- Earlier maps show 89% of reporting states at “extremely below share” but 33% in later maps
[]
Conclusion and limitations
These visualizations highlight an increase in data availability and equity in vaccine distribution to marginalized groups over time. They are limited by inconsistent reporting and raise questions about what explains such inequity in vaccine distribution.
Does vaccine hesitancy explain inequity in distribution?
We also wanted to measure to what extent people’s hesitation to get the vaccine has affected lack of vaccinations by racial groups on a national scale. Using data from both KFF for vaccinations and the Morning Consult for hesitancy, we created a bar chart that compares the percentage of people in each racial group that reported that they were either uncertain or unwilling to get the vaccine with the percentage that have not been vaccinated. To further compare these values, we also added a ratio that accounts for the percentage of people who are hesitant to get vaccinated out of those who aren’t vaccinated, again by racial group.
ggplot(bardata1,
aes(fill=measure,
y=value,
x=race)) +
geom_bar(position="dodge",
stat="identity") +
scale_fill_brewer(palette = "Set2") +
labs(
title = "Does vaccine hesitancy account for lack of vaccinations among racial groups?",
y = "Percentage",
x = "Race",
fill = "Measure")
Here, we see that Black Americans are most hesitant to get the vaccine, followed by Hispanics, and then White. This makes sense given the history of racial discrimination in the healthcare system that has, understandingly, led to a general distrust of government led health initiatives. It is also worth noting that the percentage of non vaccinated people by racial group shows the same trend, with Blacks having the highest and whites the lowest. This suggests that there could be a correlation between the two measures, but it could be more useful to analyze what percentage of non vaccinated people said they were hesitant to get the vaccine. By dividing the hesitant percentage by the non vaccinated percentage, we are able to do this.
Ratio values for Black and White Americans is fairly high, indicating that a majority of those who wish to get vaccinated from those groups are able to do so. For Hispanic Americans, the ratio is slightly lower, which shows that about half of Hispanics who are not hesitant to get the vaccine still have not been vaccinated. This aligns with our previous data, as the demographic metric for Hispanics seemed to be lower than that for Black and White people. Some factors that could contribute to this difference may lie in the fact that out of these 3 groups, Hispanics are more likely to be immigrants, so language and citizenship barriers are present. However, we also have to keep in mind that age and other factors such as predisposed conditions have allowed some to get vaccinated earlier than others, so a percentage of those not vaccinated and not hesitant simply could have not been eligible at the time we collected our data.
Considering vaccine distribution and COVID-19 cases at the county level
New York City
nyc_boroughs <- read_csv("nyc_boroughs.csv")
## Warning: Missing column names filled in: 'X1' [1]
## Parsed with column specification:
## cols(
## X1 = col_double(),
## long = col_double(),
## lat = col_double(),
## group = col_double(),
## order = col_double(),
## region = col_character(),
## subregion = col_character(),
## COUNTYFP = col_character()
## )
nyc_cases <- read_csv("nyc cases by borough and age and race .csv") %>%
select(c("subgroup"
, "BK_CASE_COUNT"
, "BX_CASE_COUNT"
, "MN_CASE_COUNT"
, "QN_CASE_COUNT"
, "SI_CASE_COUNT")) %>%
rename("subregion" = "subgroup"
,"Brooklyn" = "BK_CASE_COUNT"
,"Bronx" = "BX_CASE_COUNT"
, "Manhattan" = "MN_CASE_COUNT"
, "Queens" = "QN_CASE_COUNT"
, "Staten Island" = "SI_CASE_COUNT" ) %>%
pivot_longer(c(-subregion)) %>%
pivot_wider(names_from = subregion, values_from = value) %>%
clean_names() %>%
select(c("name"
, "boroughwide"
, "asian_pacific_islander"
, "black_african_american"
, "hispanic_latino"
, "white")) %>%
rename("subregion" = "name"
, "asian" = "asian_pacific_islander"
, "black" = "black_african_american"
, "hispanic" = "hispanic_latino") %>%
mutate(asian_cases = asian/boroughwide
, black_cases = black/boroughwide
, hispanic_cases = hispanic/boroughwide
, white_cases = white/boroughwide)
## Parsed with column specification:
## cols(
## group = col_character(),
## subgroup = col_character(),
## BK_CASE_COUNT = col_double(),
## BK_CASE_RATE = col_double(),
## BX_CASE_COUNT = col_double(),
## BX_CASE_RATE = col_double(),
## MN_CASE_COUNT = col_double(),
## MN_CASE_RATE = col_double(),
## QN_CASE_COUNT = col_double(),
## QN_CASE_RATE = col_double(),
## SI_CASE_COUNT = col_double(),
## SI_CASE_RATE = col_double()
## )
nyc_fully_vaccinated_by_race <- read_csv("nyc_fully_vaccinated_by_race.csv") %>%
rename("subregion" = "X1")
## Warning: Missing column names filled in: 'X1' [1]
## Parsed with column specification:
## cols(
## X1 = col_character(),
## asian_fully = col_double(),
## black_fully = col_double(),
## latino_fully = col_double(),
## white_fully = col_double()
## )
tracts <- tracts(state = 'NY', cb=TRUE) %>%
inner_join(nyc_boroughs, by = "COUNTYFP")
##
|
| | 0%
|
|= | 1%
|
|= | 2%
|
|== | 2%
|
|== | 3%
|
|=== | 4%
|
|==== | 5%
|
|==== | 6%
|
|===== | 7%
|
|====== | 9%
|
|======= | 10%
|
|======= | 11%
|
|======== | 11%
|
|======== | 12%
|
|========= | 13%
|
|============= | 18%
|
|============== | 19%
|
|================= | 25%
|
|================== | 25%
|
|================== | 26%
|
|====================== | 32%
|
|======================= | 33%
|
|======================== | 34%
|
|============================ | 40%
|
|============================= | 41%
|
|============================= | 42%
|
|================================ | 46%
|
|================================= | 47%
|
|================================== | 48%
|
|====================================== | 55%
|
|======================================= | 56%
|
|======================================== | 57%
|
|========================================== | 60%
|
|=========================================== | 62%
|
|============================================ | 63%
|
|================================================= | 70%
|
|================================================== | 71%
|
|================================================== | 72%
|
|====================================================== | 76%
|
|====================================================== | 77%
|
|========================================================== | 84%
|
|============================================================ | 85%
|
|============================================================ | 86%
|
|================================================================ | 91%
|
|================================================================ | 92%
|
|================================================================= | 93%
|
|================================================================== | 94%
|
|================================================================== | 95%
|
|======================================================================| 100%
nyc_merged <- geo_join(tracts, nyc_fully_vaccinated_by_race, "subregion", "subregion") %>%
inner_join(nyc_cases, by = "subregion")
## Warning: `group_by_()` is deprecated as of dplyr 0.7.0.
## Please use `group_by()` instead.
## See vignette('programming') for more help
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_warnings()` to see where this warning was generated.
popup <- paste0("<em>"
, nyc_merged$subregion
, "</em>"
, "<br>"
, "<br>"
, "Asian: Fully vaxxed: "
, round(nyc_merged$asian_fully,2)
, " Cases: "
, round(nyc_merged$asian_cases,2)
, "<br>"
, "Black: Fully vaxxed: "
, round(nyc_merged$black_fully,2)
, " Cases: "
, round(nyc_merged$black_cases,2)
, "<br>"
, "Latino: Fully vaxxed: "
, round(nyc_merged$latino_fully,2)
, " Cases: "
, round(nyc_merged$hispanic_cases,2)
, "<br>"
, "White: Fully vaxxed: "
, round(nyc_merged$white_fully,2)
, " Cases: "
, round(nyc_merged$white_cases,2))
pal <- colorNumeric(
palette = "YlGnBu",
domain = nyc_merged$boroughwide
)
leaflet() %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(data = nyc_merged,
fillColor = ~pal(boroughwide),
color = "#b2aeae", # you need to use hex colors
fillOpacity = 0.7,
weight = 1,
smoothFactor = 0.2,
popup = popup)
## Warning: sf layer has inconsistent datum (+proj=longlat +datum=NAD83 +no_defs).
## Need '+proj=longlat +datum=WGS84'